package com.atguigu.java.ai.langchain4j.store;

import com.atguigu.java.ai.langchain4j.bean.ChatMessages;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.ChatMessageDeserializer;
import dev.langchain4j.data.message.ChatMessageSerializer;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * @Author huoyz
 * @Date 2025/5/9 15:56
 * @Version 1.0
 * @mongodb  创建持久化类目的是为了持久化到mongodb中去
 * SeparateMemoryChatAssistantConfig 里面重写持久化的操作
 */
@Component
public class MongoChatMemoryStore implements ChatMemoryStore {

    @Autowired
    MongoTemplate mongoTemplate;
    @Override
    public List<ChatMessage> getMessages(Object memoryId) {

        //根据用户id查询，绘话记忆中，memoryId查询比如查询id=1的绘话 用户为1的人进行查询
        Criteria id = Criteria.where("memoryId").is(memoryId);
        Query query = new Query(id);
        //希望查出来的类为ChatMessages类型
        ChatMessages chatMessages = mongoTemplate.findOne(query,ChatMessages.class);
        //因为要返回这个List<ChatMessage> 所以得把查出来的content转成这个类型
        if (chatMessages==null){
            return new LinkedList<>();
        }
        /**该代码行将从 MongoDB 查询到的 JSON 格式聊天内容 content，
         通过 ChatMessageDeserializer.messagesFromJson 方法反序列化为
         List<ChatMessage> 类型并返回。*/
        return ChatMessageDeserializer.messagesFromJson(chatMessages.getContent());
    }

    @Override
    public void updateMessages(Object memoryId, List<ChatMessage> list) {
        //先根据id查询出要改的数据
        Criteria id = Criteria.where("memoryId").is(memoryId);
        Query query = new Query(id);
        Update update = new Update();
        //该行代码将聊天消息列表序列化为JSON字符串，并设置为MongoDB更新操作中的"content"字段。
        Update set = update.set("content", ChatMessageSerializer.messagesToJson(list));

        //修改或新增  若是有id则是修改没有则自动新增
        mongoTemplate.upsert(query, update,ChatMessages.class);
    }

    @Override
    public void deleteMessages(Object memoryId) {
        Criteria id = Criteria.where("memoryId").is(memoryId);
        Query query = new Query(id);
        mongoTemplate.remove(query, ChatMessages.class);
    }
}
